﻿using System;
namespace FibNum_WithLimits
{
    class Program
    {
        static long ReadIntFromConsole()
        {
            try
            {
                return (long.Parse(Console.ReadLine()));
            }
            catch
            {
                Console.WriteLine("Ошибка ввода числа. Попробуйте снова");
                return ReadIntFromConsole();
            }
        }
        static long ReadLongPosFromConsole()
        {
        CHECK: long limit = ReadIntFromConsole();
            while (limit < 0)
            {
                Console.WriteLine("Ошибка ввода числа. Число является отрицательным. Попробуйте снова");
                limit = ReadIntFromConsole();
                if (limit > 0) break;
            }
            if (limit > 7000000000000000000)
            {
                Console.WriteLine("Ошибка ввода числа. Превышено максимальное значение. Попробуйте снова.");
                goto CHECK;
            }
            return limit;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Чиисла Фибоначчи — элементы числовой последовательности, в которой каждое последующее число равно сумме двух предыдущих чисел.");
            Console.WriteLine("");
            Console.WriteLine("Данная программа выводит числа Фибоначчи в заданном вами диапазоне и считает их количество. Для получения результата нужно ввести 2 стартовых числа, от которых начнется построение последовальности, и верхний предел вывода чисел. Каждое введенное число должно быть положительным, целым, и быть по значению не большим, чем 7*10^18. В противном случае ввод будет считаться некорректным. После ввода числа для продолжения работы нажмите Enter.");
            Console.WriteLine("");
            Console.WriteLine("Введите стартовое числo1:");
            long start1 = ReadLongPosFromConsole();
            Console.WriteLine("");
            Console.WriteLine("Введите стартовое числo2:");
            long start2 = ReadLongPosFromConsole();
            Console.WriteLine("");
            Console.WriteLine("Введите верхний предел вывода чисел:");
            long limit = ReadLongPosFromConsole();
            long fib0 = start1, fib1 = start2;
            Console.WriteLine("-----------------------------------------------------------------");
            Console.Write(fib0);
            Console.Write(" ");
            Console.Write(fib1);
            Console.Write(" [");
            Int16 count = 0;
            long fib = fib0 + fib1;
            while (fib <= limit)
            {
                Console.Write(" ");
                Console.Write(fib);
                fib0 = fib1;
                fib1 = fib;
                fib = fib0 + fib1;
                count++;
            }
            Console.WriteLine(" ]");
            Console.WriteLine("-----------------------------------------------------------------");
            Console.WriteLine("Количество чисел, которые попали в заданный диапазон, составляет:");
            Console.WriteLine(count);
            Console.ReadKey();
        }
    }
}
